<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.zgl.youshuda.core.utils.OperResult" %>
<%@ page import="com.zgl.youshuda.core.utils.codenode.MksNodeTool" %>
<%@ page import="com.zgl.youshuda.core.utils.StringUtils" %>
<%@ page import="java.util.Optional" %>
<%@ page import="com.alibaba.fastjson2.JSONObject" %>
<%@ page import="com.zgl.youshuda.core.utils.CommonUtil" %>
<%@ page import="com.zgl.youshuda.core.logic.db.SqlValueEscapeUtil" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%--
  //创建人: XXX
  //创建时间: XXXX

  //以下信息用于当前程序页面在平台中自动注册激活
    <descInfo>
        <businessDesc>
            组装CURD查询条件 //请描述当前代码页面的功能
        </businessDesc>
        <businessType>
            A8F483A996254646BFD8396FD3C3ABCB //请从粘贴从组件类型管理中注册获得的类型编码，如：D7783010192D4F47B261BCF17EE03712
        </businessType>
        <processDesc>
          //请描述当前代码页面的详细实现过程
          //如：1、获取入库区点位信息
          // 2、获取库区内空货架信息
          // 3、实现点位与货架的配送逻辑
          	组装CURD查询条件
        </processDesc>
        <inParams>
            //type 请修改为传入此程序页面的参数类型，如：String、Integer、Map等变量管理窗口中的所有变量类型之一
            //enName 请修改为传入此程序页面的参数名，如：warehourseCode
            //cnName 请修改为传入此程序页面的参数描述，如：仓库编号
        </inParams>
        <outParams>
            {
                "msg": "查询成功", //返回当前程序页面执行是否成功初始信息到图形化程序（实际返回值可由页面程序维护）
                "code": 200, //返回指定的HTTP页面初始状态编码用于图形化程序跟踪，如200执行成功，500服务器异常，404未找到页面等（实际返回值根据页面程序执行结果自动修改）
                "data": {}, //返回当前页面程序执行结果数据到图形化编程页面，可以是String、Integer、Map等变量管理窗口中的所有变量类型之一
                "success": true //返回当前页面是否执行成功状态用于图形化程序跟踪，值只有true和false（实际返回值根据页面程序执行结果自动修改）
            }
        </outParams>
    </descInfo>
--%>

<%

    MksNodeTool mksNodeTool = new MksNodeTool(pageContext); //初始化图形编程平台工具包
    mksNodeTool.responseUtil.send(running(mksNodeTool)); //调用图形编程入口方法

%>
<%!
    /**
     * 初始化构造函数
     * running 为统一的调用方法,方法名禁止修改
     */
    private OperResult running(MksNodeTool mksNodeTool) {

        //初始化程序执行出参变量数据
        OperResult result = OperResult.getSuccessInstance();

        try {
            /**
             * 以下变量是在变量池中获取的，变量名与流程变量管理中变量名或节点中使用的变量一致
             */
            //已组装好的查询条件
            String whereCondition = mksNodeTool.getVarData("whereCondition");
            //规则类型
            String ruleType = mksNodeTool.getVarData("ruleType");
            if(StringUtils.isEmptyIncludeNull(ruleType)){
                throw new NullPointerException("查询规则不能为空");
            }
            //当前被循环处理的字段名
            String nowColumnName = mksNodeTool.getVarData("conditionItemKey");
            if(StringUtils.isEmptyIncludeNull(nowColumnName)){
                throw new NullPointerException("当前被循环处理的字段名不能为空");
            }
            //当前被循环的值
            Object nowColumnValObj = mksNodeTool.getVarData("conditionItemVal");
            String nowColumnVal = String.valueOf(nowColumnValObj);
            if(StringUtils.isEmptyIncludeNull(nowColumnVal)){
                result.setData(OperResult.getSuccessInstance(null, "执行成功"));
                return result;
            }
            //参数字段类型、查询方式等配置信息
            Map<String,Map> paramsColumnInfo = (Map<String, Map>) Optional.ofNullable(mksNodeTool.getVarData("paramsColumnInfo"))
                    .orElseThrow(() -> new NullPointerException("参数字段类型、查询方式等配置信息不能为空"));
            //当前字段规则信息
            Map columnRuleInfo = Optional.ofNullable(paramsColumnInfo.get(nowColumnName))
                    .orElseThrow(() -> new NullPointerException("字段规则信息不能为空"));
            //当前组件类型

            String formType = String.valueOf(columnRuleInfo.get("formType"));
            if(StringUtils.isEmptyIncludeNull(formType)){
                throw new NullPointerException("组件类型不能为空");
            }
            //匹配类型
            String queryType = String.valueOf(columnRuleInfo.get("queryType"));
            if(StringUtils.isEmptyIncludeNull(queryType) && !("datetime".equals(formType) || "date".equals(formType))){
                throw new NullPointerException("匹配类型不能为空");
            }
            //组装当前条件
            String _whereCondition="";

            if("datetime".equals(formType) || "date".equals(formType)){
                /**
                 * 日期时间类型处理
                 */
                //先解析时间，如果多个时间默认传递是以TO分隔的
                /** 当前被循环的值为空时，不做处理 **/
                if(StringUtils.isNotEmptyIncludeNull(nowColumnVal)){
                    String[] dates = nowColumnVal.split("TO");
                    if(dates.length>1){
                        _whereCondition = StringUtils.format(" {} BETWEEN '{}' AND '{}' ",nowColumnName,"<db:"+SqlValueEscapeUtil.escapeString(dates[0])+">","<db:"+SqlValueEscapeUtil.escapeString(dates[1])+">");
                    }else{
                        _whereCondition = StringUtils.format(" {} = '{}' ",nowColumnName, "<db:"+SqlValueEscapeUtil.escapeString(dates[0])+">");
                    }
                }
            }else if("select".equals(formType) || "checkbox".equals(formType)){
                /**
                 * 存在多选的情况下
                 */
                String[] columnVals = nowColumnVal.split(",");
                for(String val : columnVals){
                    _whereCondition += parseCondition(queryType,nowColumnName,val) + " OR ";
                }
                if(StringUtils.isNotEmptyIncludeNull(_whereCondition) && _whereCondition.indexOf("OR")>-1){
                    _whereCondition = " ("+_whereCondition.substring(0,_whereCondition.lastIndexOf("OR"))+") ";
                }
            }else{
                _whereCondition = parseCondition(queryType,nowColumnName,nowColumnVal);
            }

            if(StringUtils.isEmptyIncludeNull(_whereCondition)){
                //将页面程序处理数据保存至出参变量数据
                result.setData(OperResult.getSuccessInstance(null, "执行成功，未匹配到处理条件"));
                return result;
            }
            if(StringUtils.isEmptyIncludeNull(whereCondition)){
                mksNodeTool.setVarData("whereCondition",_whereCondition);
            }else{
                mksNodeTool.setVarData("whereCondition",whereCondition+" "+ruleType+" "+_whereCondition);
            }
            //将页面程序处理数据保存至出参变量数据
            result.setData(OperResult.getSuccessInstance(null, "执行成功"));

        } catch (Exception e) {
            //将异常日志输出到图形化程序控制台
            result.errorResult(CommonUtil.getExceptionAllInfo(e));

        } finally {
            //将当前页面程序执行结果数据返回至图形化程序
            return result;

        }
    }

    /**
     * 解析查询条件
     * @param nowColumnName
     * @param nowColumnVal
     * @return
     */
    private String parseCondition(String queryType,String nowColumnName,String nowColumnVal) {
        String result = "";
        //特殊字符转义
        nowColumnVal = SqlValueEscapeUtil.escapeString(nowColumnVal);
        switch (queryType){
            case "EQ":
                // 等于
                result = StringUtils.format(" {} = '{}' ",nowColumnName,"<db:"+nowColumnVal+">");
                break;
            case "LIKE":
                // 包含
                result = StringUtils.format(" {} LIKE CONCAT('%',{},'%') ",nowColumnName,"<db:"+nowColumnVal+">");
                break;
            case "NE":
                // 不等于
                result = StringUtils.format(" {} != '{}' ",nowColumnName,"<db:"+nowColumnVal+">");
                break;
            case "GT":
                // 大于
                result = StringUtils.format(" {} > '{}' ",nowColumnName,"<db:"+nowColumnVal+">");
                break;
            case "GTE":
                // 大于等于
                result = StringUtils.format(" {} >= '{}' ",nowColumnName,"<db:"+nowColumnVal+">");
                break;
            case "LT":
                // 小于
                result = StringUtils.format(" {} < '{}' ",nowColumnName,"<db:"+nowColumnVal+">");
                break;
            case "LTE":
                // 小于等于
                result = StringUtils.format(" {} <= '{}' ",nowColumnName,"<db:"+nowColumnVal+">");
                break;
            case "NULL":
                // 为空
                result = StringUtils.format(" {} IS NULL ",nowColumnName);
                break;
            case "NOTNULL":
                // 非空
                result = StringUtils.format(" {} IS NOT NULL ",nowColumnName);
                break;
        }
        return result;
    }
%>